<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>弹性滑动导航</title>
<style>
  body,
  ul {
    margin: 0;
  }
  ul {
    padding: 0;
    list-style: none;
  }
  a {
    text-decoration: none;
    color: #000;
  }
  .nav {
    height: 50px;
    background-color: skyblue;
    text-align: center;
    margin-top: 50px;
  }
  .nav ul {
    width: 1200px;
    margin: 0 auto;
    height: inherit;
    position: relative; /* 相对定位 */
    z-index: 0; /* 创建自己的层叠上下文 */
  }
  .nav ul li {
    float: left;
    font-size: 16px;
    height: inherit; /* 继承 */
  }
  .nav ul li a {
    display: block;
    padding: 0px 20px;
    line-height: 50px;
  }

  .nav ul li:first-child a {
    color: #fff;
  }
  .nav ul li:last-child {
    width: 72px;
    height: 60px;
    background-color: rgb(3, 135, 187);
    /*这个li用来做底部蓝色滑块，需要相对ul进行绝对定位*/
    position: absolute;
    left: 0px;
    top: -5px;
    z-index: -1;
    /* 添加过渡动画 */
    transition: left 0.3s, width 0.3s;
  }
  /* 这里的功能需要用js来实现，
    以下只是用css简单演示实现原理 */
  .nav ul li:hover ~ .move {
    width: 110px;
    left: 348px;
  }
</style>
</head>
<body>
<div class="nav">
  <ul>
    <li><a href="#">首页</a></li>
    <li><a href="#">免费直播课</a></li>
    <li><a href="#">web前端工程师</a></li>
    <li><a href="#">Java架构师</a></li>
    <li><a href="#">实战案例视频</a></li>
    <li><a href="#">关于我们</a></li>
    <!--这个li是用来做深蓝色的小滑块-->
    <li class="move"></li>
  </ul>
</div> 
<script>
  const move = document.querySelector(".move");
  const oUl = document.querySelector(".nav ul ");
  // 用来保存前一个鼠标移入的元素 (最开始为第一个li中的a )
  let prevA = document.querySelector(".nav ul li:first-child a");
  oUl.addEventListener("mouseover", function (e) {
    // 获取鼠标移入到的元素是否是 a
    const target = e.target;
    if (target.tagName.toLowerCase() !== "a") return;
    // 如果是a元素，则获取a元素的宽、高、与 ul左边的距离
    const width = target.offsetWidth;
    const height = target.offsetHeight;
    const left = target.offsetLeft;
    // 动态设置 move的宽度，高度和 left值
    move.style.width = width + "px";
    move.style.height = height + 10 + "px";
    move.style.left = left + "px";
    // 当前a标签文字颜色变为白色，其它的全还原
    if (prevA) {
      console.log(prevA);
      prevA.style.color = "#000";
    }
    move.style.display = "block";
    target.style.color = "#fff";
    prevA = target;
  });
</script>
</body>
</html>
